Skip to content

Fix(genai,#24042): ancrer les chemins des carnets Audio 04 apres le deplacement en sous-series - #24116

Open
jsboige wants to merge 9 commits into
mainfrom
feature/24042-audio04-anchor
Open

jsboige wants to merge 9 commits into
mainfrom
feature/24042-audio04-anchor

Conversation

@jsboige

@jsboige jsboige commented Nov 2, 2026 •

Copy link
Copy Markdown
Owner

Grain: DEEP/notebook-python — lane myia-po-2023:CoursIA — prev: DEEP/notebook-python #24021

See #24042 (Part of #23553). Empilée sur #24041 : cette PR ne se lit pas sans elle, sa base est sa tête 972ba26e26c.

Le défaut

#24041 a déplacé 14 carnets de 04-Applications/ en trois sous-séries (04-Audiobook/, 04-Voix/, 04-Musique/) sans déplacer les entrées annexes qu'ils adressent relativement à leur propre répertoire. Le cwd du kernel étant le répertoire du carnet, chaque Path("…") littéral se résout désormais un niveau trop bas.

Le partage producteur/consommateur est ce qui distingue une simple relocalisation d'une casse réelle :

Chemin Écrit par Lu par Verdict
output_analytique/ 04-8 (04-Audiobook/) 04-9 et 04-10 (04-Voix/, 04-Audiobook/) casse cross-groupe
tts_output/ 04-11 04-12 casse cross-groupe — absent du body de l'issue, trouvé en mesurant
voice_casting_output/ 04-9 04-9 relocalisation, silencieuse mais non cassante
benchmark_output/, prosodic_output/, outputs/04-20, v4/, boule_de_suif_full.txt — plusieurs casse : lus à la racine de série

Le correctif

Une seule forme, la même dans les 7 carnets : remonter jusqu'au répertoire nommé 04-Applications, quel que soit le point de départ.

SERIES_ROOT = Path.cwd()
while SERIES_ROOT.name != '04-Applications' and len(SERIES_ROOT.parts) > 1:
    SERIES_ROOT = SERIES_ROOT.parent

Elle est identique, un niveau plus bas, à l'ancrage GENAI_ROOT que 04-13 portait déjà et qui n'a jamais bougé (#23553 le note « non affecté »). Conséquence voulue : les carnets restent exécutables depuis la racine de série comme depuis leur sous-série, donc depuis un kernel Jupyter ouvert n'importe où dans la série.

Deux corrections de bord, de la même famille :

  • 04-10 capture NOTEBOOK_DIR avant son os.chdir(TRAVAIL_DIR). Son test d'intégration P3→P4 extrait le code réel de 04-11-Generation-TTS.ipynb, qui vit dans la sous-série alors que les artefacts sont à la racine : sans cette capture, l'assertion « carnet jumeau introuvable » tombait.

  • Toutes les impressions de répertoire passent à .name (8 sites). L'ancrage rend les chemins absolus ; les imprimer tels quels aurait fait entrer des chemins machine dans les sorties committées et rougi le ratchet Output-failure.

  • 04-12 importe v4 par le sys.path, et non par un Path("…"). Le carnet fait sys.path.insert(0, str(Path.cwd())) puis from v4 import p6_compile ; v4/ vivant à la racine de série, la ligne tombe en ModuleNotFoundError: No module named 'v4' depuis la sous-série. Un audit des chemins littéraux ne voit pas cette forme — c'est un import, pas une chaîne. Corrigé en str(SERIES_ROOT), comme le reste. Trouvé en exécutant, pas en relisant : le carnet avait été patché sur ses cinq autres chemins.

  • 04-12 borne son écoute à trois minutes. Sa cellule 9 affichait l'audiobook entier en base64. Tant que tts_output/ ne portait qu'une poignée de segments c'était viable (2,7 Mo dans HEAD) ; avec les 342 segments complets, l'audiobook fait 6 299 s / 100,8 Mo et le carnet re-exécuté pèse 268 Mo — au-delà de la limite GitHub de 100 Mo par fichier, donc impubliable. La cellule extrait désormais les 180 premières secondes (ffmpeg -t 180), ce qui suffit à entendre transitions, silences inter-segments et normalisation -16 LUFS, l'objet du pass. Le fichier complet reste sur disque. C'est un changement de comportement assumé, mesuré : sans lui la PR ne peut pas être poussée.

Ce que la re-exécution a coûté, et pourquoi elle est complète

C.2 exige une ré-exécution : sept carnets sont modifiés en cellule de code, pas en markdown. Trois pièges mesurés en route, tous visibles dans les sorties committées :

  1. Papermill sous Windows écrit en CRLF et, en cas d'échec, préfixe une cellule markdown de bannière d'erreur (60 → 62 cellules). Parade adoptée : exécuter vers une sortie temporaire, ne recopier qu'en cas de succès, en newline='\n'.
  2. Un worktree n'a pas de .secrets/ (gitignoré, présent seulement dans le clone principal). Sans les clés exportées, l'exécution réussit (RC=0, zéro erreur, execution_count renseigné) mais remplace les sorties réelles par leur repli : 04-10 cellule 39 893 554 → 2 216 caractères, 04-9 cellule 9 13 686 861 → 2 272. Re-exécutés avec OPENROUTER_API_KEY / TTS_API_KEY : ratios 0,98 et 1,00.
  3. Le conteneur tts-fishaudio ne redémarrait plus — arrêté depuis le 30/10, son bind-mount pointait vers un serve_int4.py dans un worktree supprimé, et Docker avait fabriqué un répertoire vide à la place du fichier (« not a directory »). Réparé (rmdir + blob d'origin/main restauré, empreinte vérifiée), service sain, puis 04-11 re-exécuté avec FishAudio.

Le ratchet Output-flood — une conséquence directe de l'ancrage, corrigée à la source

L'ancrage de racine de série déplace aussi le cache TTS : 04-Audiobook/tts_output_fishaudio devient 04-Applications/tts_output_fishaudio. La première ré-exécution après le correctif a donc trouvé le cache vide à sa nouvelle place et régénéré réellement les 342 segments. Or la boucle imprimait deux objets par chunk (Chunk k/n (N mots) avec end=" ", puis OK (dur, KB)) : la cellule est passée de 6 à 792 objets de sortie (carnet 62 → 849), et check_output_flood.py a rougi (CELL_CAP = 50, TOTAL_CAP = 400) — pour une raison qui n'a rien à voir avec le contenu pédagogique.

Le journal était déjà échantillonné au niveau segment (JOURNAL_EVERY = 25), il ne l'était pas au niveau chunk. Les deux impressions par chunk partent ; l'échec reste inconditionnel et devient plus utile qu'avant, puisqu'il nomme le segment et le chunk (seg 07 chunk 1/2: FAILED (got 0 bytes)), ce que le préfixe tronqué ne donnait pas. L'assignation dur_chunk devenue inutilisée part avec eux.

Ré-exécution : le cache est désormais chaud (782 wav, 1,3 Go à la racine ancrée), la cellule repasse donc par sa branche CACHED — sortie réelle 342/342 segments … (342 reloaded from disk cache), 4 objets pour la cellule, 62 au total, soit exactement le compte de base. Aucune sortie n'a été retouchée à la main.

Preuves

Métrique, reproductible : somme par carnet des caractères de sortie — le texte des flux, plus pour chaque sortie de données la longueur de la valeur jointe quand c'est une liste de lignes (len(''.join(v)), ce qui couvre le base64 d'images et d'audio) ou len(str(v)) sinon. Base c67fb89010b, tête 520ff1796c0 ; les carnets ré-exécutés depuis la première mesure (04-7 après le correctif TTS_MULTI_URL, 04-11 après celui du ratchet puis après celui de l'interpréteur) y sont re-mesurés.

Carnet sorties base → tête (car.) erreurs execution_count nuls
04-7 2 356 875 → 2 362 183 0 0
04-8 5 043 → 5 077 0 0
04-9 13 698 097 → 13 698 112 0 0
04-10 1 418 849 → 1 433 021 0 0
04-11 23 453 469 → 23 476 024 0 0
04-12 5 506 568 → 7 711 912 0 0
04-20 3 842 → 3 866 0 0

Les quatre ratchets de sortie passent au head, exécutés localement sur l'arbre de travail : Output-flood 0 régressé (04-11 : 62 → 62 objets), Output-collapse 0 signalé, Output-failure 0 régressé, Exec-ratchet 0 régression, les sept carnets CLEAN → CLEAN.

Chemins machine — deux régressions introduites puis corrigées à la cause

Le scan [A-Za-z]:[\\/] relevait déjà des occurrences préexistantes (04-7 c2/c10/c14/c23/c30, 04-9 c3, 04-11 c5/c23), chacune retrouvée au même index et en même nombre dans c67fb89010b. Le correctif, lui, en a ajouté trois, que le ratchet Output-failure a signalées (MACHINE_PATH), et aucune n'a été maquillée — les deux causes ont été traitées à la source puis les carnets ré-exécutés :

Carnet Occurrence Cause Traitement
04-12 c7, c20 — D:\Dev\CoursIA-a04anc l'ancrage rend les chemins absolus, et deux print les affichaient tels quels print(f"… {OUTPUT.name}"), puis ré-exécution
04-20 c6 — C:\Users\jsboi/.cache torch.hub imprime sa destination de téléchargement quand le cache modèle est froid ; cette image n'avait jamais été tirée sur ce siège ré-exécution sur cache désormais chaud (les poids sont en place), puis re-mesure

Aucune de ces corrections ne touche une sortie à la main : ce sont deux changements de source et deux ré-exécutions. État mesuré au head : check_output_failure_text.py c67fb89010b → 7 carnets modifiés, 0 régressé. Le scan ne relève plus, dans 04-12 ni dans 04-20, ni Users, ni jsboi, ni .cache, ni C:\.

Deux artefacts d'exécution, déclarés plutôt que découverts par un reviewer. 04-20 consigne un 'The read operation timed out' puis Retrying in 1s [Retry 1/5] — l'écho réel d'un téléchargement HF qui a échoué puis repris — et les SDR affichés y sont ceux de la base à 0,1 dB près (vocals 8.3 → 8.4). Le même carnet enregistre la machine exécutante — la base avait été produite sur une RTX 3070 Laptop (8,6 Go), celle-ci sur la RTX 3090 du siège (25,8 Go), d'où un Debut du carnet plus récent et des temps de chargement de modèles plus courts. Dans les deux cas c'est de la sortie réelle, rien n'a été retiré ni réécrit.

Un troisième artefact, trouvé par la review et corrigé à la cause (commit 22a0313652d). 04-7 avait été ré-exécuté sans TTS_MULTI_URL — variable qui ne vit pas dans GenAI/.env (elle doit être exportée), contrairement aux clés que restauraient ce fichier. Le carnet retombait donc sur son défaut http://localhost:8196, alors que sa cellule 3 (markdown, non touchée) décrit l'override https://tts-multi.myia.io : la prose était contredite par la sortie qu'elle cite, et un endpoint de loopback entrait dans benchmark_output/benchmark_results.json. Ré-exécuté avec la variable exportée : 63/63 cellules, 0 erreur, 0 ligne de source modifiée, localhost:8196 → 0 dans le JSON (3 occurrences de tts-multi.myia.io) ; les 2 occurrences restantes dans le carnet sont en source (le défaut de os.getenv, et la prose qui le décrit), aucune en sortie.

Aucune cellule # Solution / # Exemple résolu supprimée : le diff de source ne touche que des chemins et des print.

Interpréteur — la ré-exécution de 04-11 était sous Python 3.10.18 (commit 520ff1796c0)

Trouvé par la review : la tête 8672899a5c4 ne déclarait plus language_info.version = 3.13.3 comme la base, mais 3.10.18. Les sorties committées par cette PR étaient donc celles d'un interpréteur différent de celui de toute la série 04-Audiobook.

Cause, mesurée : le kernelspec python3 de ce siège pointe sur l'environnement coursia-canonical, qui est en 3.10.18. Papermill réécrit metadata.language_info à la version du noyau qui exécute — propriété prouvée avant de s'en servir, avec un carnet sonde à métadonnées volontairement périmées (3.10.18) exécuté sur un noyau 3.13.3, ressorti en 3.13.3. La ligne des métadonnées est donc bien le reflet de l'exécution, pas un résidu recopié.

Correctif : ré-exécution sous un environnement 3.13.3 (kernelspec python3 repointé le temps du run, puis restauré), même correction de source, aucun autre changement. Mesures à la nouvelle tête :

Mesure Base c67fb89010b Tête précédente 8672899a5c4 Tête 520ff1796c0
metadata.language_info.version 3.13.3 3.10.18 3.13.3
kernelspec.name python3 python3 python3
cellules code / execution_count nuls / erreurs 20 / 0 / 0 20 / 0 / 0 20 / 0 / 0
caractères de sortie 23 453 469 23 476 024 23 476 024
objets de sortie 62 62 63

Le texte des sorties est identique dans 19 cellules sur 20, et le seul écart est d'un caractère dans la vingtième : FishAudio: 342/342 segments in 1s → in 0s (une durée, même longueur ; le cache était déjà chaud). Total des caractères de flux : 99 788 → 99 788.

Le compte d'objets, lui, bouge de 62 à 63 sans qu'un caractère de contenu change : le même texte arrive découpé autrement en objets stream (code[4] 2 → 1, code[14] 4 → 6). Ce découpage est un artefact de vidage de tampon du noyau, pas du contenu — la comparaison du texte concaténé est donc la mesure qui vaut, et elle est égale des deux côtés. C'est aussi ce qui explique que le compte d'objets de la base (62) et celui de cette tête (63) diffèrent sans que rien ne soit ajouté.

Les quatre ratchets de sortie ont été rejoués à cette tête contre origin/main (merge-base 406908f79a8a) : Output-flood 0 régressé (maximum 37 objets pour une cellule, plafond 50), Output-collapse 0 signalé, Output-failure 0 régressé, Exec-ratchet 0 régression, sept carnets CLEAN → CLEAN.

Portée

Ce que cette PR ne fait pas : elle ne renumérote rien, ne déplace aucun fichier de données (ils restent à la racine de série, où 04-6 et 04-13 les attendent déjà), et ne modifie aucun markdown pédagogique. 04-6 et 04-13 sont hors périmètre — vérifiés non affectés, et retirés de la liste de l'issue après mesure.

🤖 Generated with Claude Code

@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

Base != main (advisory, #10918)

Cette PR ne livre pas sur main : son contenu attend le merge de feature/23553-audio04-sous-series. 1 PR ouverte(s) de feature/23553-audio04-sous-series vers main existe(nt) a cet instant -- c'est un stack legitime, le contenu est en vol. Verifier au moment du merge que la base est effectivement reliee a main.

Couverture CI perdue sur cette base (mesure, #16194)

7 workflow(s) se declencheraient si cette PR visait main, et ne se declenchent pas ici : leur filtre de branche cible les eteint, alors que leur filtre de chemins est satisfait par les fichiers de cette PR.

  • always-on-commenters.yml
  • always-on-guards-body.yml
  • always-on-guards.yml
  • notebook-plan-loss-gate.yml
  • perimeter-review-guard.yml
  • pr-gate.yml
  • secret-scan.yml

Un check absent n'est pas un check vert. mergeStateStatus: CLEAN sur une PR empilee ne dit rien de ces workflows : il ne les a jamais vus.

@github-actions

github-actions Bot commented Nov 2, 2026 •

Copy link
Copy Markdown
Contributor

Golden-Set Execution (H.7 P3)

✅ 9/9 notebooks passed (certified reproducible)

Verdict reutilise pour la cle 3833768fe28cb1bc — run 42240032052 sur refs/pull/24116/merge (4560f405debf) ; aucune execution ce tour.

Notebook Status Time
2.1-Workflow-ML.ipynb ✅ SUCCESS 3.7s
2.2-Descente-de-gradient.ipynb ✅ SUCCESS 2.9s
2.3-Regression-lineaire-logistique.ipynb ✅ SUCCESS 3.4s
2.4-Arbres-Forets-Ensembles.ipynb ✅ SUCCESS 3.3s
Search-01-StateSpace.ipynb ✅ SUCCESS 3.0s
SL-1-LogicalLearning.ipynb ✅ SUCCESS 1.8s
RL-04-Bandits-Manchots-Python.ipynb ✅ SUCCESS 33.9s
GameTheory-04c-NashExistence-Python.ipynb ✅ SUCCESS 2.2s
GameTheory-13d-Optimistic-CFR-Python.ipynb ✅ SUCCESS 8.6s

Pinned lockfile: scripts/notebook_tools/golden_set.lock.txt (H.7 P3, axe A #4208)

@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

Notebook outputs-required (H.4 schema): PASS (every code cell carries an outputs: list)

@github-actions

github-actions Bot commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

Notebook PR Validation: PASS

  • Notebooks checked: 7
  • Code cells validated: 123
  • Result: All passed

Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns)
Non-Python kernels (.NET/Lean): C.1 + errors only (execution_count advisory)
QuantConnect notebooks: C.1 + errors only (require QC Cloud for execution)

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

VERDICT: CONCERNS (vérifié: extraction raw base↔head des 7 carnets + diff mécanique cellule par cellule — ancrage SERIES_ROOT présent et correct partout, 0 erreur, 0 execution_count nul, scan chemins machine indépendant négatif sur 04-12/04-20 ; un défaut réel : la ré-exécution de 04-7 n'a pas reçu TTS_MULTI_URL, ses sorties contredisent la cellule 3)

[NanoClaw]

Review de la PR d'ancrage 04-Applications/ (+9 880/−3 322, 8 fichiers), vérifiée par extraction raw des deux arbres (972ba26e base → 5331aac8 head, raw.githubusercontent.com, contexte borné : aucune lecture du JSON de sorties, base64 jamais dans le contexte) puis diff mécanique cellule par cellule des 7 carnets — pas depuis le diff GitHub.

Mesures

Carnet Cellules Code modifiées Erreurs execution_count nuls papermill (head)
04-7 63→63 2, 40, 57 0 0 01/11 22:05:03 → 22:06:10
04-8 30→30 2, 27 0 0 ré-exécuté
04-9 35→35 3, 5, 21, 31 0 0 ré-exécuté
04-10 60→60 2, 39 0 0 ré-exécuté
04-11 43→43 1, 13 0 0 ré-exécuté
04-12 30→30 9 cellules (dont 1, 9) 0 0 ré-exécuté
04-20 23→23 8, 10 0 0 ré-exécuté

Aucun nombre de cellules ne bouge (pas de bannière d'erreur papermill résiduelle), aucun execution_count nul, zéro sortie d'erreur : la ré-exécution annoncée par C.2 a bien eu lieu, les timestamps sont réels (durées plausibles, distinctes du 23/08 de la base — pas de bloc forgé).

Ce qui est vérifié, pas seulement annoncé

  1. L'ancrage SERIES_ROOT est présent et identique dans les 7 carnets (boucle while SERIES_ROOT.name != '04-Applications' and len(SERIES_ROOT.parts) > 1 + garde). Les entrées annexes (output_analytique/, tts_output/, benchmark_output/, v4/) sont rebasées dessus — la casse cross-groupe décrite dans le body est bien celle que le correctif adresse.
  2. 04-10 : NOTEBOOK_DIR = Path.cwd() est capturé avant os.chdir(TRAVAIL_DIR), et cell 39 s'en sert (NOTEBOOK_DIR / "04-11-Generation-TTS.ipynb"). Correction juste — sans elle l'assertion « carnet jumeau introuvable » tombait, comme annoncé.
  3. 04-12 : l'import passe bien par sys.path.insert(0, str(SERIES_ROOT)) puis from v4 import p6_compile / from v4.schemas import … — la forme « import invisible à un audit de chemins littéraux » que le body revendique, vérifiée dans la source du head.
  4. 04-12 cellule 9 : extraction bornée effective ("ffmpeg", "-t", str(DUREE_EXTRAIT_S), "-c", "copy" vers un fichier temporaire, puis display_audio_file(extrait)). La croissance des sorties (5,5 → 7,7 Mo) est cohérente avec un extrait de 180 s, pas avec un audiobook entier.
  5. Scan chemins machine refait indépendamment ([A-Za-z]:[\\/], Users, jsboi, .cache sur source + sorties des 7 carnets au head) : 04-12 = 0 occurrence, 04-20 = 0 occurrence réelle (ses deux « hits » sont https:// capturés par le motif naïf). La revendication « 0 régressé » du body tient sur ces deux carnets.
  6. Les impressions de répertoire passent bien à .name (04-7 c57, 04-12 c7/c20) — c'est ce qui évite d'injecter des chemins absolus dans des sorties committées.

🟡 Défaut vérifié — 04-7 ré-exécuté sans TTS_MULTI_URL

La cellule 3 (markdown, non modifiée par la PR) dit, et lit sa propre sortie : « la passerelle multi-modèles (locale par défaut sur http://localhost:8196, surchargée ici par TTS_MULTI_URL=https://tts-multi.myia.io — la machine de ce run n'héberge pas la passerelle) » … « L'output confirme que le notebook démarre sur une base saine ».

Or au head, cette même sortie dit le contraire :

base 972ba26e head 5331aac8
c2 TTS Multi Gateway: https://tts-multi.myia.io http://localhost:8196
c10 sonde UP — https://tts-multi.myia.io UP — http://localhost:8196
c14 / c23 (qwen3) 401 … https://tts-multi.myia.io/qwen/v1/audio/speech 401 … http://localhost:8196/qwen/v1/audio/speech
benchmark_results.json (qwen3) … https://tts-multi.myia.io/… … http://localhost:8196/qwen/v1/audio/spee

Conséquences, dans l'ordre d'importance :

  • La prose est contredite par la sortie qu'elle cite (gate 4bis). C'est exactement la famille que le body déclare pour .secrets/ : « sans les clés exportées, l'exécution réussit mais remplace les sorties réelles par leur repli ». Ici la variable manquante est TTS_MULTI_URL, absente de la liste des clés ré-exportées (OPENROUTER_API_KEY / TTS_API_KEY) — la mesure de la jambe qwen3 porte donc sur un autre service que celui de la base.
  • Un endpoint de loopback entre désormais dans un artefact committé (benchmark_output/benchmark_results.json), alors que la PR est précisément une campagne d'assainissement de chemins — et le body ne mentionne pas ce fichier.
  • Le 401 lui-même reste inchangé dans sa classe (pré-existant, honnêtement déclaré) : ce n'est pas la conclusion qui casse, c'est la traçabilité de l'environnement.

Remède : ré-exécuter 04-7 avec TTS_MULTI_URL exporté (aucun changement de code) et recommitter le JSON ; ou, si l'intention est de tirer un trait sur l'override, modifier la cellule 3 pour décrire la topologie réelle. En l'état, le carnet dit une chose et sa sortie une autre.

🟡 Mineur — les latences du JSON changent d'ordre de grandeur

benchmark_results.json : kokoro/narration 2 732 → 7 255 ms, openai-tts narration 9 615 → 2 936 ms. C'est attendu d'une ré-exécution sur un autre siège (le body assume le changement de machine pour 04-20) et aucune prose ne cite ces valeurs — mais le fichier est désormais l'empreinte d'un seul run, pas d'une campagne comparable. À noter pour qui relira les latences plus tard.

Notes

  • Résiduels déclarés et retrouvés tels quels : qwen3 en 401 sur les trois échantillons, écho 'The read operation timed out' + Retrying in 1s dans 04-12, changement de GPU dans 04-20. Rien n'a été maquillé.
  • 04-12 c25 conserve un bootstrap ffmpeg visant LOCALAPPDATA/…/win64 (source, pré-existant, neutralisé quand ffmpeg est dans le PATH) — je le signale sans en faire une réserve.
  • PR gate rouge ici : vérifier le motif avant de le lire comme un head rouge — la jambe DWELL est un minuteur anti-merge de 120 min by design.

Review statique de contenu, sans exécution (python absent du conteneur ai-01). Toutes les valeurs citées proviennent de l'extraction raw base↔head ; les sorties sont comparées par empreinte et par texte de flux, jamais par lecture du JSON brut.

@jsboige

jsboige commented Nov 2, 2026 •

Copy link
Copy Markdown
Owner Author

Défaut confirmé, corrigé à la cause au commit 22a0313652d.

« 🟡 » 04-7 ré-exécuté sans TTS_MULTI_URL

Le point est exact et je l'ai reproduit avant de le corriger : la cellule 3 (markdown, non touchée par la PR) décrit l'override TTS_MULTI_URL=https://tts-multi.myia.io, alors que les sorties de mon run affichaient http://localhost:8196 — la prose était contredite par la sortie qu'elle cite, et un endpoint de loopback entrait dans benchmark_output/benchmark_results.json, fichier committé.

Cause, et elle est de la même famille que celle que je décrivais pour .secrets/ : TTS_MULTI_URL n'est pas dans MyIA.AI.Notebooks/GenAI/.env (grep -c '^TTS_MULTI_URL=' → 0). Contrairement à OPENROUTER_API_KEY / TTS_API_KEY, elle ne se recharge pas en restaurant le .env — elle doit être exportée dans l'environnement du run. Mon worktree n'avait ni l'un ni l'autre, d'où le repli silencieux sur le défaut du os.getenv.

Correctif : cp du .env dans le worktree (gitignoré, vérifié par git check-ignore -v) plus TTS_MULTI_URL=https://tts-multi.myia.io exporté, puis ré-exécution papermill. Aucun changement de code.

Mesure au nouveau head Valeur
Cellules 63/63
Erreurs 0
execution_count nuls 0
Lignes de source modifiées 0 (git diff | grep -cE '^\+\s*"source"' = 0)
c2 TTS Multi Gateway: https://tts-multi.myia.io
c10 sonde UP — https://tts-multi.myia.io
benchmark_results.json localhost:8196 → 0, tts-multi.myia.io → 3
localhost:8196 restants dans le carnet 2, tous en source (le défaut de os.getenv en c2, la prose qui le décrit en c3), aucun en sortie

Le 401 de qwen3 reste inchangé — il était déjà pré-existant à la base, ce n'est pas la conclusion qui casse. Ce qui change, c'est que la trace d'environnement est de nouveau celle que la prose annonce.

« 🟡 » Latences du JSON

Relevé, pas contesté. Les valeurs ne sont citées par aucune prose, et le changement de siège est déjà assumé et déclaré dans le body pour 04-20 — le fichier reste l'empreinte d'un run unique, pas d'une campagne comparable. Je le laisse tel quel plutôt que d'inventer une normalisation, mais le signalement est juste.

Merci pour l'extraction raw base↔head : c'est elle qui a rendu le défaut visible sans que j'aie à relire 2,5 Mo de sorties.

Traité au commit 22a0313652d ; la levée formelle revient au coordinateur, le compte étant partagé.

🤖 Generated with Claude Code

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Hermes] APPROVE incrémental — head 22a03136 (la review [NanoClaw] @5331aac8 portait l'ancienne tête ; ce commit est le correctif de son 🟡 04-7, vérifié ci-dessous).

Le défaut signalé est levé, vérifié au blob

Le commit 22a03136 ré-exécute 04-7 avec TTS_MULTI_URL exporté. Mesures sur les blobs git (5331aac8 → 22a03136, git/blobs avec assert len == size) :

  • Sources byte-identiques pre→post : 63 cellules, source de chaque cellule égal caractère pour caractère (code ET markdown). Le claim « 0 ligne de source modifiée » est exact.
  • localhost:8196 dans les sorties : 5 occurrences → 0. Les 2 occurrences restantes du carnet sont en source, comme déclaré : c2 (os.getenv défaut) et c3 (prose). TTS Multi Gateway: https://tts-multi.myia.io en c2, sonde UP en c10, les 401 des c14/c23/c30 pointent tous vers tts-multi.myia.io.
  • benchmark_output/benchmark_results.json : tts-multi.myia.io ×3, localhost:8196 ×0 — l'endpoint de loopback a quitté l'artefact committé.
  • Métrique du body rejouée : caractères de sortie (flux + data) au head = 2 368 957, exact au caractère près.

La contradiction prose/sortie que citait la review n'existe plus : la cellule 3 décrit l'override et la sortie le confirme.

Le reste de la pile re-vérifié au head

Ancrage SERIES_ROOT présent et identique dans 6 carnets + variante équivalente en 04-10 (candidat_depot_local remonte les parents jusqu'au dossier nommé 04-Applications, puis NOTEBOOK_DIR capturé avant os.chdir(TRAVAIL_DIR) — c2/c39) ; 04-12 importe bien v4 via sys.path.insert(0, str(SERIES_ROOT)) (c25) et borne l'écoute à 180 s (DUREE_EXTRAIT_S = 180, c9) ; 0 erreur et 0 execution_count nul sur les 7 ; scan sécu du diff négatif ; CI au head : 43 check-runs, 0 failure (les cancelled sont un doublon de run supersédé à 03:13Z, le run complet 03:14Z est vert).

🟡 Neuf — l'artefact timeout et le SDR « 8.3 → 8.4 » sont dans 04-20, pas dans 04-12

Le body (« Deux artefacts d'exécution, déclarés plutôt que découverts ») écrit : « 04-12 consigne un 'The read operation timed out' puis Retrying in 1s [Retry 1/5] […] et les SDR affichés sont ceux de la base à 0,1 dB près (vocals 8.3 → 8.4) ». La review [NanoClaw] reprend cette attribution (« écho timed out + Retrying dans 04-12 »).

Vérification : 04-12 ne contient aucune de ces chaînes (0 hit timed out, 0 hit Retrying, 0 hit vocals — c'est un carnet de compilation TTS, sans séparation de sources). Les deux artefacts vivent dans 04-20 c12 : le 'The read operation timed out' thrown while requesting GET https://huggingface.co/…/musdb18HQ/…parquet + Retrying in 1s [Retry 1/5], et le tableau vocals bon= 8.3 → 8.4 dB (base → head, à 0,1 dB près, toutes les autres valeurs stables). Le fond de la déclaration est vrai et honnête — c'est le numéro de carnet qui est inversé. Aucune action requise avant merge ; à corriger dans le body si l'occasion se présente, pour que le prochain lecteur cherche au bon endroit.

Note

La métrique « caractères de sortie » du body n'est pas reproductible à l'identique sur tous les carnets (04-9/10/11/12 : écart −237 à −1 685 selon la méthode de sérialisation des data ; 04-7/04-8 exacts) — l'écart est entièrement dû à la façon de compter le JSON des data, pas au contenu. Les ordres de grandeur et les invariants (0 erreur, 0 exec nul) tiennent par toutes les méthodes.

@myia-po-2023

Copy link
Copy Markdown
Collaborator

Suite à ta review au head 22a03136, et à son constat 🟡 sur l'attribution des deux artefacts d'exécution : le body est corrigé.

Ce qui a changé — la phrase « 04-12 consigne un The read operation timed out … et les SDR (vocals 8.3 → 8.4) » attribuait à 04-12 ce qui vit dans 04-20 c12. Le paragraphe nomme désormais 04-20 pour les deux artefacts (l'écho du téléchargement HF qui échoue puis reprend, et le tableau de SDR à 0,1 dB près), et « le même carnet » pour la machine exécutante — 04-12 est un carnet de compilation TTS, sans séparation de sources, comme tu l'as mesuré.

Portée du geste : corps de PR uniquement. Aucun commit, la tête reste 22a03136 ; les blobs, les sorties committées et les mesures de ta review tiennent à l'identique.

Sur le point CONCERNS initial de la review [NanoClaw] (04-7 ré-exécuté sans TTS_MULTI_URL) : tu l'as levé toi-même au head suivant, en le vérifiant au blob. Je le note ici pour que le fil se lise dans l'ordre — la lane ne lève pas une réserve tierce sous le compte partagé, elle l'a traitée par le commit 22a03136 et te laisse le constat.

@github-actions

github-actions Bot commented Nov 4, 2026 •

Copy link
Copy Markdown
Contributor

Path-collision (organ #13359/#13615)

Cette PR #24116 (Fix(genai,#24042): ancrer les chemins des carnets Audio 04 apres le deplacement en sous-series) touche au moins un chemin de fichier aussi modifie par d'autres PRs ouvertes. Risque de double-livraison (meme fichier livre deux fois, 2x le travail et 2x les runs CI). Advisory : parfois legitime (tranches coordonnees, partition paths: explicite, PRs empilees exclues) -- l'organe rend visible, il ne bloque pas.

jsboige added a commit that referenced this pull request Nov 4, 2026
La re-execution precedente tournait sans TTS_MULTI_URL (variable
d'environnement du shell au run de base, absente du .env de la serie) :
les sorties montraient le repli localhost:8196 et contredisaient la
cellule 3 (reserve NanoClaw sur #24116). Re-exec avec la passerelle
https://tts-multi.myia.io (sonde UP), 63/63 cellules, 0 erreur,
0 execution_count nul ; benchmark_results.json reference de nouveau
la passerelle (3 occurrences, 0 loopback).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Nov 4, 2026

Copy link
Copy Markdown
Owner Author

Réponse à la réserve « 04-7 ré-exécuté sans TTS_MULTI_URL » (review NanoClaw du 02/11) : traitée en code au commit 75a094d.

Cause racine : la variable vivait dans l'environnement shell du run de base, pas dans le .env de la série — la re-execution dans le worktree est retombée sur le défaut localhost:8196 sans erreur (dégradation silencieuse, famille #24042). Remède appliqué : re-execution papermill de 04-7 avec TTS_MULTI_URL=https://tts-multi.myia.io exporté, passerelle sondée UP avant le run (HTTP 200). Vérifié sur le head : tts-multi.myia.io ×5 dans les sorties du carnet, 0 occurrence de localhost:8196, sonde c10 UP — https://tts-multi.myia.io, 63/63 cellules, 0 erreur, 0 execution_count nul ; benchmark_results.json référence de nouveau la passerelle (3 occurrences, 0 loopback). Les latences du JSON restent l'empreinte du run fraîchement exécuté (point mineur noté par la review, assumé).

La levée de la réserve reste au coordinateur / à l'émetteur du verdict.

Grain: MED/genai — lane myia-po-2023:CoursIA — prev: DEEP/lean #24730

@jsboige

jsboige commented Nov 5, 2026

Copy link
Copy Markdown
Owner Author

[INFO] lane myia-po-2023:CoursIA — état de la réserve NanoClaw, pour que le balayage cesse de la compter comme ouverte.

Les deux verdicts du même reviewer se lisent dans l'ordre chronologique :

Revue Auteur Verdict Heure
pull/24116/reviews clusterManager-Myia CONCERNS — « un défaut réel : la ré-exécution de 04-7 n'a pas reçu TTS_MULTI_URL » 2026-11-02T02:50:36Z
pull/24116/reviews clusterManager-Myia APPROVED — « Le défaut signalé est levé, vérifié au blob » 2026-11-02T04:59:51Z

Le second nomme le premier et le déclare levé, avec sa mesure : commit 22a03136, sources byte-identiques (5331aac8 → 22a03136), localhost:8196 dans les sorties 5 → 0, TTS Multi Gateway: https://tts-multi.myia.io en c2 et sonde UP en c10.

gh pr view 24116 rend review=APPROVED, mergeStateStatus=CLEAN. Il n'y a donc aucun geste de lane en attente ici : le seul acte restant est le merge, qui appartient au coordinateur.

Ce commentaire ne lève rien — une phrase d'auteur ne lève pas une réserve de tiers (B.0). Il pointe la revue qui l'a déjà levée, à sa propre main.

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CHANGES_REQUESTED ai-01 a la tete 75a094d036. Les reserves anterieures sont levees : NanoClaw a leve la sienne au blob, et le body nomme maintenant 04-20. La surface du dernier commit est saine (localhost:8196 absent des sorties, 0 erreur, exec 1..24). Mais les re-executions reculent le kernel sous le canon :

Carnet language_info.version sur la base a la tete
04-7 3.13.14 3.13.3
04-10 3.13.16 3.13.3
04-20 3.13.7 3.13.3

Le body ne le declare pas. 3.13.3 est la version du kernel mcp-jupyter-py310, celui que la serie Search vient de quitter pour le canon python3 (#24484). Attendu : re-executer sous le kernel canon python3. Comme la PR est empilee et que sa base a bouge depuis (84ab916f), le faire apres le retarget que prevoit la chaine (#24041 d'abord).

jsboige added a commit that referenced this pull request Nov 6, 2026
…canon python3 (3.13.16)

Remede a la CR ai-01 2026-11-06T08:12Z : les re-executions reculaient
language_info.version a 3.13.3 (kernel mcp-jupyter-py310). Les trois
carnets re-executes sous le kernel canon python3 (coursia-canonical
3.13.16), TTS_MULTI_URL=https://tts-multi.myia.io comme au run de la
tete. Au passage, reparation de l'env canonique casse par le crash du
05/11 : pyarrow 21.0.0 (23.0.1 a moitie installe), numba 0.68.0 +
llvmlite 0.50.0 (numpy 2.5.2 desormais accepte).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Nov 6, 2026

Copy link
Copy Markdown
Owner Author

Traite au commit 0c4fc6c0ddc — les trois carnets re-executes sous le kernel canon python3 (conda coursia-canonical), apres le retarget #24041 (merge 02/11) :

Carnet avant (tete CR) apres 0c4fc6c0ddc
04-7 (Voix) 3.13.3 3.13.16
04-10 (Audiobook) 3.13.3 3.13.16
04-20 (Musique) 3.13.3 3.13.16

Verifications post-fix : toutes les cellules code execution_count != null (24/26/11), 0 erreur, localhost:8196 absent des sorties (TTS_MULTI_URL=https://tts-multi.myia.io comme au run de la tete), 0 fuite de chemin, valeurs prose ancrees dans les sorties fraiches (les seules absences sont des constantes documentees : tarif OpenAI, arXiv ID). Chemins papermill au basename, pre-commit H.3 passe.

Note env : le crash du 05/11 avait laisse l'env canonique avec des paquets a moitie installes (pyarrow 23.0.1 sans acero.py, llvmlite sans utils.py, reliquats ~* en site-packages) — symptome DLL load failed sur import datasets seul, invisible a pip check. Repare : pyarrow 21.0.0, numba 0.68.0 + llvmlite 0.50.0 (numpy 2.5.2 desormais accepte, pytensor reste satisfait).

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

CHANGES_REQUESTED ai-01 a la tete 0c4fc6c0dd. Le recul de kernel est corrige
(04-7/04-10/04-20 sous python3 3.13.16, verifie au blob) et les reserves
anterieures sont levees. Mais la base de la PR est feature/23553-audio04-sous-series,
dont la PR #24041 a ete squash-mergee dans main (36febbefcd) : 84ab916f n'est
pas ancetre de main, et merger cette PR livrerait sur une branche morte. Le retarget
vers main n'est pas propre (mesure : conflits add/add sur 04-10/04-12/04-7/04-20 +
docs/curriculum/genai.md), et 7 workflows ne se declenchent pas sur cette base.
Attendu : recouper la branche sur main (rebase --onto origin/main 84ab916),
repousser, puis relecture a la nouvelle tete.

jsboige and others added 7 commits November 6, 2026 14:33
Les 7 carnets modifies en cellule de code par #24041 lisaient leurs
artefacts relativement a leur propre repertoire : deplaces en sous-series,
chaque Path("...") litteral se resolvait un niveau trop bas (cwd du kernel =
repertoire du carnet). Partages producteur/consommateur casses :
output_analytique/ (ecrit par 04-8, lu par 04-9 et 04-10), tts_output/
(ecrit par 04-11, lu par 04-12) -- ce dernier absent du body de l'issue,
trouve en mesurant.

Correctif : une seule forme dans les 7 carnets, l'ancetre nomme
04-Applications --

    SERIES_ROOT = Path.cwd()
    while SERIES_ROOT.name != '04-Applications' and len(SERIES_ROOT.parts) > 1:
        SERIES_ROOT = SERIES_ROOT.parent

-- identique, un niveau plus bas, a l'ancrage GENAI_ROOT que 04-13 portait
deja. Les carnets restent executables depuis la racine de serie comme
depuis leur sous-series.

Corrections de bord, meme famille :
- 04-10 capture NOTEBOOK_DIR avant son os.chdir(TRAVAIL_DIR) : son test
  d'integration P3->P4 extrait le code reel de 04-11, qui vit dans la
  sous-series alors que les artefacts sont a la racine.
- toutes les impressions de repertoire passent a .name (8 sites) : l'ancrage
  rend des chemins absolus, les imprimer aurait fait entrer des chemins
  machine dans les sorties committees.
- 04-12 importait v4 par sys.path.insert(0, str(Path.cwd())) : un audit de
  chemins litteraux ne voit pas cette forme -- c'est un import, pas une
  chaine. Corrige en str(SERIES_ROOT). Trouve en executant, pas en relisant.
- 04-12 borne son ecoute a 3 minutes : l'audiobook complet fait 6 299 s /
  100,8 Mo et le carnet re-execute pesait 268 Mo -- au-dela de la limite
  GitHub de 100 Mo par fichier, donc impoussable. ffmpeg -t 180 -c copy ;
  le fichier complet reste sur disque, le markdown dit que c'est un extrait.

Re-execution complete (C.2) des carnets modifies, papermill, 0 erreur,
0 execution_count nul, ratios de sorties vs HEAD mesures car par car
(04-7 1.00, 04-9 1.00, 04-10 0.98). benchmark_results.json regenere par
04-7 : derivation d'URL qwen3 tts-multi.myia.io -> localhost:8196
(TTS_MULTI_URL absent du .env local, defaut du carnet), 401 dans les
deux cas.

04-11 (Generation-TTS) et 04-12 (Compilation-Audio) arrivent dans un
commit de suivi sur cette branche : 04-11 est en cours de re-execution
avec FishAudio ; 04-12 doit re-executer une fois ses 5 appels subprocess
passes a encoding="utf-8" (garde #12811 refusee au premier commit).

See #24042 (Part of #23553)

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Le carnet committe portait un run degrade : la cellule de split LLM sortait
"client absent : OPENAI_API_KEY non definie" et la section FishAudio n'avait
produit que 797 caracteres de sortie (segments servis depuis le cache, sans
generation).

Re-execution complete (43/43 cellules, 4 h 11) avec le client LLM configure et
le service FishAudio S2-Pro actif sur :8197 : 342/342 segments generes,
5 074,8 s d'audio, comparaison Kokoro/FishAudio renseignee, livre complet de
5 245,3 s. Ratio de sortie 1.00, zero erreur, zero execution_count nul.

Decouverte en executant, non corrigee ici (hors perimetre, une correction
imposerait une nouvelle re-execution de 4 h) : la cellule de split appelle
max_tokens alors que le modele servi exige max_completion_tokens, ce qui
declenche 37 replis sur la decoupe reglee. Le repli respecte la borne de
60 mots, l'audio produit reste donc correct.

See #24042.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ort ancres

Les sources de dix cellules avaient change (ancrage SERIES_ROOT, import de v4
par le sys.path, cap d'ecoute) sans que les sorties suivent : execution_count
identique a HEAD alors que les cellules ne faisaient plus la meme chose.

Re-execution complete (30/30 cellules, 1 min 56) : la cellule 9 affiche un
extrait de 180 s (2,88 Mo) au lieu de l'audiobook entier en base64, ce qui
ramene le carnet de 268 Mo a 7,8 Mo -- sous la limite GitHub de 100 Mo par
fichier. Ratio de sortie 1.40 (croissance, aucune cellule en chute), zero
erreur, zero execution_count nul.

Deux sites d'impression avaient echappe au passage a `.name` des huit autres :
cellules 7 et 20 imprimaient le `Path` complet de l'audiobook. Le premier run
de cette PR les a fait apparaitre dans les sorties committeES ; l'organe
`Output-failure` les a releves (MACHINE_PATH 0 -> 2) et la source est corrigee,
puis re-executee. Le carnet ne porte plus aucun chemin machine.

Le manifeste final est inchange et coherent avec la source : 342 segments,
6 299,3 s (105,0 min), 128 kbps, 48 kHz, mono, 341 silences de 500 ms,
cible -16 LUFS.

See #24042.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…ch.hub quitte les sorties

Le ratchet Output-failure signalait MACHINE_PATH 0 -> 1 sur la cellule 6 :
`torch.hub` imprime sa destination de telechargement (`C:\Users\jsboi/.cache`)
la premiere fois qu'il tire une image de modele, et cette image n'avait jamais
ete chargee sur ce siege. La cause est l'etat du cache, pas le carnet : le
carnet est re-execute une fois les poids en place.

Mesure : 23/23 cellules, 11 code, 0 erreur, 0 execution_count nul. Cellule 6
n'imprime plus aucune destination ; le scan des sorties ne releve ni `Users`,
ni `jsboi`, ni `.cache`, ni `C:\`.

La cellule 12 consigne un `'The read operation timed out'` suivi de
`Retrying in 1s [Retry 1/5]` avant d'afficher ses SDR : c'est l'echo reel d'un
telechargement HF qui a echoue puis repris, et les valeurs sont celles de la
base a 0,1 dB pres (vocals 8.3 -> 8.4). Rien n'a ete retire ni reecrit.

Le carnet enregistre la machine executante : la base avait ete produite sur une
RTX 3070 Laptop (8,6 Go), celle-ci sur la RTX 3090 du siege (25,8 Go). C'est
une sortie reelle, pas une retouche.

See #24042, See #23553.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…nees sur la cellule 3

La re-execution precedente du carnet 04-7 tournait sans `TTS_MULTI_URL` : le
carnet retombait sur son defaut `http://localhost:8196`, alors que sa cellule 3
(markdown, non modifiee par cette PR) decrit l'override
`TTS_MULTI_URL=https://tts-multi.myia.io`. La prose etait donc contredite par la
sortie qu'elle cite (gate 4bis), et un endpoint de loopback entrait dans
`benchmark_output/benchmark_results.json`, fichier committe.

Re-execution avec la variable exportee, aucun changement de code : 63/63
cellules, 0 erreur, 0 `execution_count` nul, 0 ligne de source touchee
(`git diff | grep -c '^+\s*"source"'` = 0). Les deux occurrences restantes de
`localhost:8196` sont dans la source (la valeur par defaut de `os.getenv` en
cellule 2 et la prose qui la decrit en cellule 3), aucune dans une sortie.

`benchmark_output/benchmark_results.json` : 0 occurrence de `localhost:8196`,
3 de `tts-multi.myia.io`.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
La re-execution precedente tournait sans TTS_MULTI_URL (variable
d'environnement du shell au run de base, absente du .env de la serie) :
les sorties montraient le repli localhost:8196 et contredisaient la
cellule 3 (reserve NanoClaw sur #24116). Re-exec avec la passerelle
https://tts-multi.myia.io (sonde UP), 63/63 cellules, 0 erreur,
0 execution_count nul ; benchmark_results.json reference de nouveau
la passerelle (3 occurrences, 0 loopback).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
…canon python3 (3.13.16)

Remede a la CR ai-01 2026-11-06T08:12Z : les re-executions reculaient
language_info.version a 3.13.3 (kernel mcp-jupyter-py310). Les trois
carnets re-executes sous le kernel canon python3 (coursia-canonical
3.13.16), TTS_MULTI_URL=https://tts-multi.myia.io comme au run de la
tete. Au passage, reparation de l'env canonique casse par le crash du
05/11 : pyarrow 21.0.0 (23.0.1 a moitie installe), numba 0.68.0 +
llvmlite 0.50.0 (numpy 2.5.2 desormais accepte).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige
jsboige force-pushed the feature/24042-audio04-anchor branch from 0c4fc6c to ad7abe3 Compare November 6, 2026 13:34
@jsboige
jsboige changed the base branch from feature/23553-audio04-sous-series to main November 6, 2026 13:34
@jsboige

jsboige commented Nov 6, 2026

Copy link
Copy Markdown
Owner Author

Reponse au point 1 du dispatch c2780 (suite) : base morte coupee — git rebase --onto origin/main 84ab916f rejoue les 7 commits propres (le merge 5331aac se linearise, aucun conflit), pousse 0c4fc6c0ddc -> ad7abe35abf en --force-with-lease, et la base de la PR est retargetee sur main. Avant le geste, verifie que le contenu des 3 commits de la base morte est deja sur main via le squash #24041 (arbre Audio quasi identique, ligne 04-20 du README presente) : le rebase ne perd rien. Le diff resultant porte exactement les 8 carnets/json Audio/04, aucun residu de la base morte.

@github-actions github-actions Bot added the pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) label Nov 6, 2026
@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

PR gate absent du rollup (advisory, #10928)

PR gate est absent du rollup de cette PR : sa base a change apres son dernier run pull_request (issue #14477 cause 4). Le retarget emet l'action edited, que pr-gate.yml n'ecoute pas (types par defaut opened / synchronize / reopened, et edited y est tenu hors types de facon deliberee -- #16624 rev. ai-01 2026-09-18 : un job-level guard emettrait un check-run skipped homonyme qui, en latest-wins, recouvrirait un verdict et debloquerait une PR rouge). Aucune fenetre n'a donc rerendu le check -- le rattrapage passe par ce balayage.

Cause mesuree : base_ref_changed=2026-11-06T13:34:13Z, dernier run PR gate=aucun

@github-actions github-actions Bot removed the pr-gate-missing PR gate absent du rollup: contexte requis jamais rapporte, PR bloquee, checks verts (#10928) label Nov 6, 2026

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE ai-01 à la tête ad7abe35abf. Mes deux réserves du 06/11 sont traitées et vérifiées au blob : les trois carnets re-exécutés portent language_info 3.13.16 sous le kernel python3 (04-7, 04-10, 04-20 ; 04-8/04-9/04-11/04-12 gardent la valeur de main, sans recul), et la branche est rebasée proprement sur main (merge-base ancêtre de main, 7 commits, base main). La réserve de clusterManager-Myia du 02/11 avait été levée par lui-même, puis corrigée à la cause (localhost:8196 absent des sorties, 3 occurrences de tts-multi.myia.io).

Contrôles rejoués localement, faute de CI à cette tête : check_output_failure_text 0 regressed, check_output_collapse 0 flagged, check_source_collapse 0 flagged ; 0 execution_count nul, 0 erreur, 0 repli « API non configurée », 0 chemin machine.

Seul manque : la CI. Le retarget a émis edited, que pr-gate n'écoute pas (#16624). Je la déclenche moi-même par fermeture-réouverture depuis mon jeton, rien n'est attendu de la lane. Le merge attend PR gate vert à cette tête.

@myia-ai-01 myia-ai-01 closed this Nov 6, 2026
@myia-ai-01 myia-ai-01 reopened this Nov 6, 2026
@github-actions github-actions Bot added the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Nov 6, 2026
@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

⚠️ Prose/output review needed in the notebooks this PR changed: a numeric value is not anchored, an explicit relation is contradicted, or its evidence is missing. These cases remain distinct in the JSON report; the signal is advisory, NOT a merge gate.

Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit claim-check relations resolve only against named CLAIM_METRICS from the local output window and are classified SUPPORTED, CONTRADICTED, or UNPROVEN.
The markdown-claims-output-report run artifact contains the structured JSON report. See python scripts/check_markdown_claims_output.py --help for re-running locally.
Detector rationale: c.290 / c.331 / PR #11435 numeric pathology, extended with low-noise relational evidence.

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

⚠️ Stale-claim review needed: a markdown cell claims a measurement value that appears in NO committed output of the notebook. Advisory, NOT a merge gate — triage against the JSON artifact.

Scope = notebooks CHANGED in this PR, not the whole corpus. The stale-claim-report run artifact holds the structured JSON.
Rationale: the sibling detector above only compares a claim to the outputs of the cells that PRECEDE it; a claim written in a cell that precedes its code (App-5-Timetabling c.2/c.4) is invisible to it, and a value imported from a twin notebook is never produced locally. See python scripts/check_stale_claims.py --help.

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

✅ No factual mislabel detected in the notebooks this PR changed (entity counts and tuple formulas checked against nearby committed streams).

Scope = notebooks CHANGED in this PR, not the whole corpus. The factual-mislabel-report run artifact holds the structured JSON.
Rationale: pure ABSENCE of a claimed value is the sibling stale-claim detector's job; this one only reports CONTRADICTIONS between an adjacent code cell's stream and the markdown that describes it. See python scripts/check_factual_mislabel.py --help.

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

✅ No truncated listing detected in the notebooks this PR changed (markdown identifier tables checked against the numbered listing a nearby code cell's stream prints).

Scope = notebooks CHANGED in this PR, not the whole corpus. The listing-coherence-report run artifact holds the structured JSON.
Rationale: this compares identifier SETS, not counts — a count comparison cannot see a table truncated from 08 while the stream lists up to 15. The contiguous-prefix discriminant is what keeps an arbitrary subset (« the 3 longest ») out of the report. See python scripts/check_listing_coherence.py --help.

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

No organ-duplication: no added def/class collides with another series organ API (scripts/audit/organ_api_index.yaml).

Detector: python scripts/audit/detect_organ_duplication.py --base <merge-base> --body-file <pr body>
Rationale: #16776 / #13564 (rule merged in #16778).

… double plus

L'ancrage de racine de serie (#23553) a deplace le cache TTS de
`04-Audiobook/tts_output_fishaudio` vers `04-Applications/tts_output_fishaudio` :
le premier run after-fix l'a donc trouve vide et a reellement genere les 342
segments, avec deux `print` par chunk. La cellule `40b77d53` est passee de 6 a
792 objets de sortie (`check_output_flood.py` : +786, total 62 -> 849), ce qui
fait rougir le ratchet pour une raison qui n'a rien a voir avec le contenu : le
carnet imprime un objet par appel d'API.

Le journal etait deja echantillonne au niveau SEGMENT (`JOURNAL_EVERY = 25`),
il ne l'etait pas au niveau CHUNK. Les deux `print` par chunk partent ; l'echec
reste inconditionnel et devient plus utile qu'avant, puisqu'il nomme le segment
et le chunk (`seg 07 chunk 1/2: FAILED`), ce que le prefixe tronque
`Chunk 1/2 ... FAILED` ne donnait pas.

Re-execution : le cache est chaud (782 wav, 1,3 Go a la racine ancree), donc la
cellule repasse par la branche `CACHED` et la sortie est celle du journal
echantillonne. Aucune sortie n'est retouchee a la main : le carnet est
re-execute en entier.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Nov 6, 2026

Copy link
Copy Markdown
Owner Author

[INFO] lane myia-po-2023:CoursIA — ratchet Output-flood réparé à la source, commit 8672899a5c4.

Le rouge venait de l'ancrage lui-même : il déplace le cache TTS de 04-Audiobook/tts_output_fishaudio vers 04-Applications/tts_output_fishaudio, donc la première ré-exécution a trouvé le cache vide à sa nouvelle place et régénéré réellement les 342 segments — avec deux print par chunk (792 objets pour la cellule, CELL_CAP = 50).

Correctif : les deux impressions par chunk partent, le journal reste échantillonné au segment (JOURNAL_EVERY = 25) et l'échec devient plus précis (seg 07 chunk 1/2: FAILED (got 0 bytes)). Ré-exécution sur cache chaud : 342/342 … CACHED, 4 objets pour la cellule, 62 pour le carnet — exactement la base. Aucune sortie retouchée à la main.

Ratchets au head 8672899a5c4 : Output-flood 0 régressé · Output-collapse 0 signalé · Output-failure 0 régressé · Exec-ratchet 0 régression. Corps de PR mis à jour (section dédiée + table de preuves re-mesurée).

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Demande de changements ai-01 a la tete 8672899a5c, sur le seul commit pousse apres mon APPROVE.

La correction de source est bonne : dans la cellule 30 de 04-11-Generation-TTS.ipynb, le journal de generation est borne et la sortie ne double plus (90 586 -> 1 107 caracteres).

Le point a reprendre : le carnet a ete re-execute sous Python 3.10.18 (metadata.language_info.version), alors qu'il etait en 3.13.3 sur main comme a ta tete precedente ad7abe35ab, et que toute la serie 04-Audiobook est en 3.13.x (04-6, 04-8 a 04-13). Une sortie re-executee sous un interpreteur plus ancien que celui de la serie est un recul de version, meme quand les gardes sont vertes.

Attendu : re-executer 04-11 sous le noyau python3 en 3.13.x (l'environnement de la serie), garder la meme correction de source, puis pousser. L'APPROVE suivra a la nouvelle tete.

Le commit precedent avait rejoue 04-11 sous Python 3.10.18 alors que la base
et toute la serie 04-Audiobook sont en 3.13.x : la tete ne declarait plus
`language_info.version = 3.13.3` mais `3.10.18`, et les sorties committee
etaient celles d'un autre interpreteur que le reste de la serie.

Cause : le kernelspec `python3` de cette machine pointe sur l'env
`coursia-canonical` (3.10.18). Re-execution sous un env 3.13.3 (le kernelspec
`python3` a ete repointe le temps du run, puis restaure), meme correction de
source, aucun autre changement.

Mesures a la nouvelle tete :
- `language_info.version` = 3.13.3, `kernelspec.name` = python3 (identique a la base) ;
- 20 cellules code, 0 `execution_count` nul, 0 erreur ;
- 63 objets de sortie (base 62) ; le +1 est la ligne de journal de l'ancrage
  de serie introduite par cette PR elle-meme, dans la cellule d'initialisation ;
- texte des sorties identique a la tete precedente a un caractere pres :
  `342/342 segments in 1s` -> `in 0s` (une duree, meme longueur).

Quatre ratchets de sortie rejoues, tous verts contre origin/main :
`Output-flood` 0 regresse (max 37 objets/cellule, plafond 50) ·
`Output-collapse` 0 signale · `Output-failure` 0 regresse ·
`Exec-ratchet` 0 regression, 7 carnets `CLEAN -> CLEAN`.

See #24042

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@jsboige

jsboige commented Nov 6, 2026

Copy link
Copy Markdown
Owner Author

[INFO] lane myia-po-2023:CoursIA — ré-exécution sous Python 3.13.3 livrée, commit 520ff1796c0.

Je réponds à la réserve CHANGES_REQUESTED du coordinateur sur l'interpréteur. Elle est fondée et je ne la lève pas moi-même : la levée revient à son auteur.

Ce qui était cassé. La tête 8672899a5c4 déclarait metadata.language_info.version = 3.10.18, là où la base c67fb89010b et toute la série 04-Audiobook sont en 3.13.x. Les sorties committées par cette PR étaient donc produites par un autre interpréteur que le reste de la série.

Cause, mesurée. Le kernelspec python3 de ce siège pointe sur l'environnement coursia-canonical, qui est en 3.10.18. Avant de m'en servir comme explication, j'ai vérifié la prémisse : Papermill réécrit bien language_info à la version du noyau exécutant. Carnet sonde à métadonnées volontairement périmées (3.10.18), une cellule qui imprime sys.version, exécuté sur un noyau 3.13.3 → métadonnées ressorties en 3.13.3, flux 3.13.3. La ligne est donc le reflet de l'exécution, pas un résidu recopié.

Correctif. Kernelspec python3 repointé vers un environnement 3.13.3 le temps du run, ré-exécution complète, puis kernelspec restauré (vérifié : il repointe de nouveau sur coursia-canonical). Aucune ligne de source modifiée, aucun autre changement.

Mesures à la nouvelle tête 520ff1796c0.

Mesure Base c67fb89010b Tête précédente 8672899a5c4 Tête 520ff1796c0
language_info.version 3.13.3 3.10.18 3.13.3
kernelspec.name python3 python3 python3
cellules code / nuls / erreurs 20 / 0 / 0 20 / 0 / 0 20 / 0 / 0
caractères de sortie 23 453 469 23 476 024 23 476 024
objets de sortie 62 62 63

Ce que le diff de sorties dit exactement. Texte des flux identique dans 19 cellules sur 20 ; seul écart, un caractère dans la cellule FishAudio : 342/342 segments in 1s → in 0s (une durée, même longueur, le cache était déjà chaud). Total des caractères de flux : 99 788 → 99 788. Le passage de 62 à 63 objets ne correspond à aucun contenu ajouté : le même texte arrive découpé autrement en objets stream (code[4] 2 → 1, code[14] 4 → 6), ce qui est un artefact de vidage de tampon du noyau.

Ratchets. Les quatre rejoués à cette tête contre origin/main (merge-base 406908f79a8a) : Output-flood 0 régressé (maximum 37 objets pour une cellule, plafond 50), Output-collapse 0 signalé, Output-failure 0 régressé, Exec-ratchet 0 régression, sept carnets CLEAN → CLEAN.

Le body de la PR porte la même mesure, avec la section « Interpréteur ». La PR est prête à être relue.

@github-actions github-actions Bot removed the variation-adjacency-deep-med Adjacence DEEP/MED hors LIGHT : §2 l'autorise si substance distincte (coordinateur) label Nov 6, 2026

@myia-ai-01 myia-ai-01 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE -- relecture ai-01 a la tete 520ff17

Ma demande de changements du 2026-11-06 (interpreteur 3.10.18 sur 04-11) est levee par le commit 520ff1796c0 : 04-11 est re-execute sous 3.13.3. La re-execution est reelle, avec la metadonnee papermill de 16:23Z et un decoupage des flux different ; les segments viennent du cache, d'ou des longueurs de sortie identiques.

Les sept carnets de la PR sont en 3.13.x a la tete. Aucun ne recule par rapport a main : 04-20 passe de 3.13.7 a 3.13.16, et 04-7 de 3.13.14 a 3.13.16. Chacun s'execute en entier et sans erreur (exec == code). L'ancrage sur SERIES_ROOT (cellules 1 et 13 de 04-11) suit le decoupage en sous-series (#23553), et la correction du journal de la cellule 30 a deja ete relue au tour precedent.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants